package com.malou.server.ventas.separacion;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.malou.client.ventas.separacion.DetalleSeparacion;
import com.malou.client.ventas.separacion.PagarSeparacion;
import com.malou.client.ventas.separacion.Separacion;
import com.malou.client.ventas.venta.DetalleVenta;
import com.malou.client.ventas.venta.Venta;
import com.malou.server.base.Conexion;
import com.malou.server.base.util.GxtGridPaginate;
import com.malou.server.ventas.ingresostock.IngresoStocks;
import com.malou.server.ventas.serie.Series;
import com.malou.server.ventas.venta.Ventas;

public class Separaciones {
	
	private static SqlMapClient sqlMap = null;
	public static Integer errorTipo = 0;
	public static String modeloPrenda = "";
	
	@SuppressWarnings("unchecked")
	public static PagingLoadResult<Separacion> getPaginate(GxtGridPaginate paginate) {		      
		
		sqlMap = Conexion.getSqlMap();
		paginate.setLimit();
		
		paginate.condition = paginate.condition.replace("documento", "td.descripcion");
		
		if(paginate.order.equals("")){
			paginate.order = " order by id desc";
		}
		List<Separacion> data = null;
		try {
			data = sqlMap.queryForList("paginateSeparacion", paginate);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return new BasePagingLoadResult<Separacion>(data, paginate.offset, count(paginate));
	}
	
	public static Integer count(GxtGridPaginate paginate){
		Integer count = null;
		try {
			count = (Integer) sqlMap.queryForObject("countSeparacion", paginate);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count;
	}
	
	@SuppressWarnings("unchecked")
	public static List<DetalleSeparacion> getDetalle(Integer separacion_id) {			
		sqlMap = Conexion.getSqlMap();
		
		List<DetalleSeparacion> data = null;
		try {
			data = sqlMap.queryForList("getDetalleSeparacion", separacion_id);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return data;
	}

	public static boolean save(Separacion v, PagarSeparacion pag, List<DetalleSeparacion> list) {
		boolean retorno = true;		
        sqlMap = Conexion.getSqlMap();
        try {
        	Series.sqlMap = sqlMap;
        	sqlMap.startTransaction();
        	if(Series.hasSerie(v.getTienda_id(), v.getTipodocumento_id())){
        		
        		sqlMap.insert("insertSeparacion", v);
        		pag.setSeparacion_id(v.getId());
        		sqlMap.insert("insertPagarSeparacion", pag);
        		
        		Integer separacion_id = v.getId();
        		Integer tienda_id = v.getTienda_id();
        		
        		IngresoStocks.sqlMap = sqlMap;
        		for(DetalleSeparacion dv : list){
        			dv.setSeparacion_id(separacion_id);
        			if(IngresoStocks.hasStock(dv.getModeloprenda_id(), dv.getCantidad(), tienda_id)){
        				sqlMap.insert("insertDetalleSeparacion", dv);
        				IngresoStocks.disminuyeStockTienda(dv.getModeloprenda_id(), dv.getCantidad(), tienda_id);        				
        			}else{
        				sqlMap.endTransaction();
        				retorno = false;
        				errorTipo = 2; //stock insuficiente
        				modeloPrenda = dv.getModeloprenda();
        				break;        				
        			}
        		}
        		
        		if(retorno){        			        			
	        		sqlMap.commitTransaction();
        		}
        	}else{
        		retorno = false;    
        		errorTipo = 1; //no existe serie
        	}
        } catch (SQLException e) {
        	retorno = false;
			e.printStackTrace();
		}
        
     	try {
			sqlMap.endTransaction();
		} catch (SQLException e) {				
			e.printStackTrace();
		}
         
        return retorno;
	}
	
	public static boolean anular(Integer id) {
		boolean retorno = true;
		
        try {
        	anularSeparacion(id);       	
        } catch (SQLException e) {
        	retorno = false;
			e.printStackTrace();
		}    	
        
        return retorno;
	}

	public static boolean anularAll(List<Integer> ids) {
		boolean retorno = true;
		
        try {
        	for(Integer id: ids){
        		anularSeparacion(id);
        	}        	    	
        } catch (SQLException e) {
        	retorno = false;
			e.printStackTrace();
		}    	
        
        return retorno;
	}
	
	@SuppressWarnings("unchecked")
	private static void anularSeparacion(Integer id) throws SQLException {		
		Separacion v = null;
		
		List<DetalleSeparacion> list = null;
		Integer tienda_id = null;		
        sqlMap = Conexion.getSqlMap();
        
    	sqlMap.startTransaction();
    	
    	sqlMap.update("anulaSeparacion", id);
    	v = (Separacion)sqlMap.queryForObject("getSeparacion", id);
    	
    	list = sqlMap.queryForList("getDetalleSeparacion", id);
    	IngresoStocks.sqlMap = sqlMap;
    	tienda_id = v.getTienda_id();
    	for(DetalleSeparacion dv : list){
    		IngresoStocks.incrementaStockTienda(dv.getModeloprenda_id(), dv.getCantidad(), tienda_id);
    	}
    	
    	sqlMap.commitTransaction();        	
    	sqlMap.endTransaction();
	}

	public static boolean pagar(PagarSeparacion pag) {
		boolean retorno = true;		
		Separacion sep = null;
	
		sqlMap = Conexion.getSqlMap();
		try {
			sqlMap.startTransaction();
			sep = (Separacion)sqlMap.queryForObject("getSeparacion", pag.getSeparacion_id());
			if(pag.getMonto() <= sep.getSaldo()){
				sqlMap.insert("insertPagarSeparacion", pag);
				if(pag.getMonto().compareTo(sep.getSaldo()) == 0){
					sqlMap.update("cancelaSeparacion", pag.getSeparacion_id());
					insertSeparacionAsVenta(sep, pag.getFecha());					
					if(errorTipo != 0)
						retorno = false;
				}	else
					sqlMap.update("updateSaldoSeparacion", pag);
				
				if(retorno){        		        			
	        		sqlMap.commitTransaction();
        		}				
			}else
				retorno = false;
			
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		try {
			sqlMap.endTransaction();
		} catch (SQLException e) {				
			e.printStackTrace();
		}
		return retorno;
	}

	@SuppressWarnings("unchecked")
	public static List<PagarSeparacion> getDetallePago(Integer separacion_id) {			
		sqlMap = Conexion.getSqlMap();
		
		List<PagarSeparacion> data = null;
		try {
			data = sqlMap.queryForList("getDetallePago", separacion_id);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return data;
	}
	
	private static void insertSeparacionAsVenta(Separacion sep, Date fechacancelacion) throws SQLException{
		Venta v = new Venta();
		v.setCliente_id(sep.getCliente_id());
		v.setTipodocumento_id(sep.getTipodocumento_id());
		v.setTotal(sep.getTotal());
		v.setIgv(sep.getIgv());
		v.setFecha(fechacancelacion);
		v.setTienda_id(sep.getTienda_id());
		v.setEstadoventa_id(3);//realizado por separacion
		
		List<DetalleSeparacion> sep_detalle = getDetalle(sep.getId());
		
		List<DetalleVenta> list = new ArrayList<DetalleVenta>(); 
		DetalleVenta dv;		
		for(DetalleSeparacion det : sep_detalle){
			dv = new DetalleVenta();
			dv.setModeloprenda_id(det.getModeloprenda_id());
			dv.setModeloprenda(det.getModeloprenda());
			dv.setPreciounitario(det.getPreciounitario());
			dv.setCantidad(det.getCantidad());
			dv.setSubtotal(det.getSubtotal());
			list.add(dv);
		}
		Ventas.sqlMap = sqlMap;
		if(!Ventas.saveSeparacion(v, list)){
			errorTipo = Ventas.errorTipo;			
		}		
	}

	
}